package estructuras;

public class DLL {
    
    private DLLNode _head;
    private DLLNode _tail;
    private int     _length = 0; 
    
    private DLL (){
        _head = null;
        _tail = null;
    }
    
    private DLLNode crearNodo(Object pPorCrear){
        DLLNode temp = new DLLNode (pPorCrear);
        return temp;
    }
    
    private void meterHead(Object pPorMeter){
        DLLNode temp = crearNodo(pPorMeter);
        _head = _tail = temp;        
    }
    
    private void meterFinal(Object pPorMeter){
        DLLNode temp = crearNodo(pPorMeter);
        if (_length == 0){
            meterHead(pPorMeter);
        }
        else{
            temp._prew = _tail;
            _tail._next = temp;
            _tail = temp;
        }
        _length++;
    }
    
    private void eliminaPorPosicion (int pCasillaPorEliminar){
        if(pCasillaPorEliminar == 1){
            _head._prew = null;
            _head = _head._next;
        }
        else{
            int contador = 1;
            DLLNode temp = _head;
            while(contador +1 != pCasillaPorEliminar){
                temp = temp._next;
                contador++;
            }
            if (contador +1 == _length){
                temp._next = null;
                _tail = temp;                
            }
            else{
                temp._next._next._prew = temp;
                temp._next = temp._next._next;
            }
        }
        _length--;
    }
    
    private boolean buscarYDarPosicion(Object pPorBuscar){
        int posicion = 1;
        for (DLLNode temp2 = _head; temp2 != null; temp2 = temp2._next){
            if (temp2._elemento == pPorBuscar){
                System.out.println("true, esta en la posicion es: " +posicion);
                eliminaPorPosicion(posicion);
                return true;
            } 
            else {
            }
            posicion++;
        }
        System.out.println("false, no se encontró el elemento");
        return false;
    }
    
    private void imprimir(){
        for(DLLNode aux = _head;aux != null;aux = aux._next){
            System.out.print(aux._elemento+ ", ");            
        }
        System.out.println("");
        System.out.println("tamaño_lista = "+_length);
    }
    
//    public static void main(String[] args) {
//        DLL listaDoble = new DLL(); 
//        
//        listaDoble.meterFinal(1);
//        listaDoble.meterFinal(2);
//        listaDoble.meterFinal(3);
//        listaDoble.meterFinal(4);
//        listaDoble.meterFinal(5);
//        listaDoble.meterFinal(6);
//        listaDoble.meterFinal(7);
//        listaDoble.meterFinal(8);
//        listaDoble.meterFinal(9);
//        
//        listaDoble.imprimir();
//        
//        listaDoble.buscarYDarPosicion(0);
//        
//        listaDoble.imprimir();
//    }
}
